home *** CD-ROM | disk | FTP | other *** search
- Unit Sysfunc ;
- (* ================================================================= *)
- (* MsDos SYSTEM dependent Routines for Kermit . *)
- (* ================================================================= *)
- Interface
- Uses Dos,Crt,Graph, (* Standard Turbo Pascal Units *)
- KGlobals,modempro ;
- TYPE
- ScreenArray = array [0..3999] of byte ;
- Var
- RealScreen : ^ScreenArray ;
- GraphDriver,Graphmode : integer ;
- margintop,marginbot : byte ;
- (* Functions & Procedures *)
- Function KeyChar (var Achar,Bchar : byte): boolean ;
- Procedure CursorUp ;
- Procedure CursorDown ;
- Procedure CursorRight ;
- Procedure CursorLeft ;
- Procedure Scroll(updown,top,bottom:byte);
- Procedure FatCursor(flag :boolean);
- Procedure RemoteScreen ;
- Procedure LocalScreen ;
- Procedure SetDefaultDrive (Drive : Byte);
- Function DefaultDrive : Byte ;
-
- (* ================================================================= *)
- Implementation
- CONST
- (* FLAGS in flag register *)
- Cflag = $0001 ;
- Pflag = $0004 ;
- Aflag = $0010 ;
- Zflag = $0040 ;
- Tflag = $0100 ;
- Iflag = $0200 ;
- Dflag = $0400 ;
- Oflag = $0800 ;
-
- VAR
- RemSaveX,RemSaveY,LocSaveX,LocSaveY : integer ;
- SaveLocalScreen : ^ScreenArray ;
- SaveRemoteScreen : ^ScreenArray ;
- register : registers ;
- NumLock,ScrollLock : byte ;
- Mono : boolean ;
- i : integer ;
- (* ------------------------------------------------------------------ *)
- (* KeyChar - get a character from the Keyboard. *)
- (* It returns TRUE if character found and the char is *)
- (* returned in the parameter. *)
- (* It returns FALSE if no keyboard character. *)
- (* *)
- (* ------------------------------------------------------------------ *)
- Function KeyChar (var Achar,Bchar : byte): boolean ;
- Begin (* KeyChar *)
- with register do
- begin
- ah := 1;
- intr($16,register);
- if (Zflag and flags)=Zflag then
-
- (* ------ The following code is required only if we want to us the ----- *)
- (* ------ NUMLOCK and SCROLLLOCK key as function keys ----------------- *)
- begin (* check for Numlck and Scroll Lck *)
- ah := 2;
- intr($16,register);
- If (al and $10) <> ScrollLock then
- Case (al and $0F) of
- 0: Bchar := $46 ; (* not shifted *)
- 1,2,3: Bchar := $86 ; (* shifted *)
- 4,5,6,7: Bchar := $87 ; (* control *)
- else Bchar := $87 ; (* Alt *)
- end (* case *)
- else
- If (al and $20) <> NumLock then
- Case (al and $0F) of
- 0: Bchar := $45 ; (* not shifted *)
- 1,2,3: Bchar := $85 ; (* shifted *)
- 4,5,6,7: Bchar := $88 ; (* control *) (* Not Available *)
- Else Bchar := $88 ; (* Alt *)
- End (* case *)
- else Bchar := 0 ;
- ScrollLock := (al and $10) ;
- NumLock := (al and $20) ;
- Achar := 0 ;
- If Bchar <> 0 then KeyChar := true
- else KeyChar := false
- End (* check for Numlck and Scroll Lck *)
- (*------ If you don't need this code, replace it with ------------------ *)
- (* -------- KeyChar := False ----------------------------------------- *)
- else
- begin
- ah := 0;
- intr($16,register);
- Achar := al ;
- Bchar := ah ;
- KeyChar := true;
- end ;
- end;
- End ; (* KeyChar *)
-
- (* ------------------------------------------------------------------ *)
- (* CursorUp - *)
- (* ------------------------------------------------------------------ *)
- Procedure CursorUp ;
- Begin (* CursorUp *)
- If margintop <> WhereY then GotoXY(WhereX,WhereY-1);
- End; (* CursorUp *)
-
- (* ------------------------------------------------------------------ *)
- (* CursorDown - *)
- (* ------------------------------------------------------------------ *)
- Procedure CursorDown ;
- Begin (* CursorDown *)
- If marginbot <> WhereY then GotoXY(WhereX,WhereY+1);
- End; (* CursorDown *)
-
- (* ------------------------------------------------------------------ *)
- (* CursorRight - *)
- (* ------------------------------------------------------------------ *)
- Procedure CursorRight ;
- Begin (* CursorRight *)
- GotoXY(WhereX+1,WhereY);
- End; (* CursorRight *)
-
- (* ------------------------------------------------------------------ *)
- (* CursorLeft - *)
- (* ------------------------------------------------------------------ *)
- Procedure CursorLeft ;
- Begin (* CursorLeft *)
- GotoXY(WhereX-1,WhereY);
- End; (* CursorLeft *)
- (* ------------------------------------------------------------------ *)
- (* Scroll - Scrolls a section of screen up or down. *)
- (* ------------------------------------------------------------------ *)
- Procedure Scroll(updown,top,bottom:byte);
- Begin (* Scroll *)
- With register do
- begin (* Scroll up *)
- ch := top ; cl := 0 ; (* top right hand corner *)
- dh := bottom ; dl := 79 ; (* bottom left hand corner *)
- bh := $07 ; (* blank line attribute *)
- al := 1 ; (* number of line to scroll *)
- ah := updown ; (* Function code 6 - Scroll up *)
- (* Function code 7 - Scroll down *)
- intr($10,register);
- end (* Scroll *)
- End; (* Scroll *)
-
- (* ------------------------------------------------------------------ *)
- (* FatCursor - *)
- (* ------------------------------------------------------------------ *)
- Procedure FatCursor(flag :boolean);
- Begin (* FatCursor *)
- With register do
- begin (* Cursor size *)
- if Mono then cl := 12
- else cl := 7 ;
- if flag then ch := 1
- else if Mono then ch := 11
- else ch := 6 ;
- ah := 1; (* Function code 1 - Select cursor type *)
- intr($10,register);
- end ; (* Cursor size *)
- End; (* FatCursor *)
-
- (* ------------------------------------------------------------------ *)
- (* RemoteScreen - Procedure *)
- (* This procedure save the local screen and restores *)
- (* the remote screen. *)
- (* Also setup the 25th line to display settings *)
- (* ------------------------------------------------------------------ *)
- Procedure RemoteScreen ;
- var i : integer ;
- Begin (* RemoteScreen *)
- LocSaveX := whereX ; LocSaveY := whereY ; (* Save local cursor *)
- SaveLocalScreen^ := RealScreen^ ; (* Save local Screen *)
- RealScreen^ := SaveRemoteScreen^ ; (* Switch Screens *)
- if Line25Flag then
- begin (* ---- set up 25th line with status ------ *)
- GotoXY(1,25);
- If Mono then
- Begin Textcolor(Black) ; Textbackground(White); end
- else
- Begin Textcolor(Blue); Textbackground(Yellow); end ;
- Write (' Port ');
- If PrimaryPort then Write('One : ')
- else Write('Two : ');
- Write(Baudrate,' baud, ');
- Case paritytype(parity) of
- OddP : write('Odd ');
- EvenP: write('Even ');
- MarkP: write('Mark ');
- NoneP: write('None ');
- end ; (* parity case *)
- Write('parity, ');
- If LocalEcho then Write('Half duplex, ')
- else Write('Full duplex, ');
- If XonXoff then write('IBM-Xon ')
- else if NoEcho then write('NoEcho ')
- else write('Standard ');
- Write (' ExitChar=CTL ',chr($5C),' ' ) ;
- Textcolor(LightGray); Textbackground(0);
- end (* ---- set up 25th line with status ------ *)
- else
- begin (* clear 25th line *)
- Textcolor(White) ; Textbackground(0) ;
- GotoXY(1,25);
- write(' ':79);
- End ; (* clear 25th line *)
- (* -------------------------------------------- *)
- Window(1,1,80,24);
- GotoXY(RemSaveX,RemSaveY);
- End; (* RemoteScreen *)
-
- (* ------------------------------------------------------------------ *)
- (* LocalScreen - Procedure *)
- (* This procedure save the remote screen and restores *)
- (* the local screen. *)
- (* ------------------------------------------------------------------ *)
- Procedure LocalScreen ;
- Begin (* LocalScreen *)
- RemSaveX := whereX ; RemSaveY := whereY ; (* Save Remote Cursor *)
- SaveRemoteScreen^ := RealScreen^ ; (* Save Remote Screen *)
- RealScreen^ := SaveLocalScreen^ ; (* Restore Local Screen *)
- TextColor(Yellow); TextBackground(Black);
- Window(1,1,80,25);
- GotoXY(LocSaveX,LocSaveY);
- End; (* LocalScreen *)
- (* ------------------------------------------------------------------ *)
- (* SetDefaultDrive - *)
- (* ------------------------------------------------------------------ *)
- Procedure SetDefaultDrive (Drive : Byte);
- Begin (* SetDefaultDrive *)
- With register do
- begin (* Select disk *)
- DL := Drive ;
- Ax := $0E00 ; { Select default drive }
- MsDos(Register);
- end; (* Select disk *)
- End; (* SetDefaultDrive *)
-
- (* ------------------------------------------------------------------ *)
- (* DefaultDrive - returns the value of the default drive *)
- (* A=0,B=1,C=2 etc. *)
- (* ------------------------------------------------------------------ *)
- Function DefaultDrive : Byte ;
- Begin (* DefaultDrive *)
- With register do
- begin (* Current disk *)
- Ax := $1900 ; { Find default drive }
- MsDos(Register);
- DefaultDrive := al ;
- end; (* Current disk *)
- End; (* DefaultDrive *)
- (* ----------------------------------------------------------------- *)
- Begin (* Sysfunc Unit *)
- new(SaveRemoteScreen);
- new(SaveLocalScreen) ;
- RemSaveX := 1 ;
- RemSaveY := 1 ;
- For i:= 0 to 1999 do
- Begin (* Clear out SaveRemoteScreen *)
- SaveRemoteScreen^[i*2] := $20 ; (* Blank Character *)
- SaveRemoteScreen^[i*2+1] := $07 ; (* light Gray on Black *)
- End ;(* Clear out SaveRemoteScreen *)
- DetectGraph(GraphDriver,GraphMode);
- Case GraphDriver of
- CGA : RealScreen := PTR($B800,0000);
- MCGA : RealScreen := PTR($B800,0000);
- EGA : RealScreen := PTR($B800,0000);
- EGA64 : RealScreen := PTR($B800,0000);
- EGAMono: RealScreen := PTR($B800,0000);
- HercMono : RealScreen := PTR($B000,0000);
- ATT400 : RealScreen := PTR($B800,0000);
- VGA : RealScreen := PTR($B800,0000);
- PC3270 : RealScreen := PTR($B800,0000);
- else RealScreen := PTR($B000,0000);
- End ; (* case *)
-
- Mono := (GraphDriver=HercMono) or
- (GraphDriver=EGAMono) or
- (RealScreen =PTR($B000,0000)) ;
-
- End. (* Sysfunc Unit *)
-